<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="description" content="A tool used to obfuscate python scripts." />
  <meta name="keywords" content="Python, 加密, 源代码, 混淆, 保护" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

  <title>Python 源代码加密器</title>

  <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" />
  <style type="text/css">
    #global-message {
      position: absolute;
      left: 0;
      right: 0;
      top: 50px;
      z-index: 1;
    }
    input.form-control.required {
      background-color: #f5f5dc;
    }
  </style>

  <script type="text/javascript" src="js/jquery.min.js"></script>
  <script type="text/javascript" src="js/bootstrap.min.js"></script>
  <script data-main="app" src="js/require.js"></script>
  <script type="text/javascript"></script>
</head>

<body role="document">
  <nav role="navigation" class="navbar navbar-inverse">
    <div class="container">
      <div class="navbar-header">
        <a class="navbar-brand" href="http://pyarmor.dashingsoft.com">PyArmor <span class="badge">试用版</span></a>
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-main-tab" aria-expanded="false">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
      </div>
      <!-- /.navbar-header -->
      <div class="collapse navbar-collapse" id="navbar-main-tab">
        <ul class="nav navbar-nav">
          <li role="presentation" class="active"><a href="#tab-scripts" aria-controls="tab-scripts" role="tab" data-toggle="tab">加密脚本</a></li>
          <li role="presentation"><a href="#tab-licenses" aria-controls="tab-licenses" role="tab" data-toggle="tab">生成许可</a></li>
          <li role="presentation"><a href="#tab-packer" aria-controls="tab-packer" role="tab" data-toggle="tab">打包</a></li>
          <li role="presentation"><a href="#obfuscator-console" aria-controls="obfuscator-console" role="tab" data-toggle="tab">帮助和日志</a></li>
        </ul>
        <ul class="nav navbar-nav navbar-right">
          <li role="presentation"><a class="btn-link" target="_blank" href="order-zh.html">购买</a></li>
          <li role="presentation"><a class="btn-link" href="index.html">English</a></li>
          <!-- <li role="presentation"><button type="button" class="btn btn-success navbar-btn btn-sm">English</button></li>           -->
        </ul>
      </div>
      <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
  </nav>

  <div id="global-message"></div>

  <div class="tab-content container">
    <div role="tabpanel" class="tab-pane active" id="tab-scripts">
      <div class="panel panel-info">
        <div class="panel-heading">加密 Python 源代码</div>
        <div class="panel-body">
          <form>
            <div class="form-group" style="display: none;">
              <label for="input_src">源文件目录</label>
              <input type="text" class="form-control required" id="input_src" />
              <p class="help-block">必填。输入一个本机的绝对路径，里面所有的 <code>.py</code> 文件都会被加密，包括子目录</p>
            </div>
            <div class="form-group">
              <label for="input_entry">主脚本</label>
              <input type="text" class="form-control required" id="input_entry"/>
              <p class="help-block">必填。输入全路径的主脚本文件名称。对于 Python 包，输入全路径的 <code>__init__.py</code></p>
              <p class="help-block">这个路径下面的所有的 <code>.py</code> 文件都会被加密</p>
            </div>
            <div class="form-group">
              <label for="input_output">输出目录</label>
              <input type="text" class="form-control" id="input_output"/>
              <p class="help-block">可选。默认输出目录是 PyArmor 包所在的路径下面的目录 <code>dist</code></p>
            </div>
            <button type="button" class="btn btn-primary" id="obfuscate-scripts">开始加密</button>
          </form>
        </div>
        <!-- /.panel-body -->
      </div>
      <!-- /.panel-default -->
    </div>
    <!-- /.tab-pane -->
    <div role="tabpanel" class="tab-pane" id="tab-licenses">
      <div class="panel panel-info">
        <div class="panel-heading">生成新的许可文件</div>
        <div class="panel-body">
          <form>
            <div class="form-group">
              <p class="help-block text-muted"><small>加密脚本的时候会自动生成一个默认的认证文件 <code>license.lic</code>，这里用来生成新的认证文件</small></p>
            </div>
            <div class="form-group">
              <label for="input_license_rcode">注册码</label>
              <input type="text" class="form-control required" id="input_license_rcode"/>
              <p class="help-block">必填。标识符字符串，不能包含空格</p>
              <!-- <p>和符号（下划线、连字符和小数点例外），新生成的认证文件存放在 PyArmor 包所在的路径下面 <code>licenses/CODE/liceense.lic</code></p> -->
            </div>
            <div class="form-group">
              <label for="input_expired_date">有效期</label>
              <input type="text" class="form-control" id="input_expired_date" placeholder="YYYY-MM-DD" />
              <p class="help-block">可选。输入有效日期，超过这个日期之后加密脚本无法在使用</p>
            </div>
            <div class="form-group">
              <label for="input_bind_disk">硬盘序列号</label>
              <input type="text" class="form-control" id="input_bind_disk"/>
              <p class="help-block">可选。绑定加密脚本到固定的硬盘</p>
            </div>
            <div class="form-group">
              <label for="input_bind_mac">网卡地址</label>
              <input type="text" class="form-control" id="input_bind_mac" placeholder="aa:bb:cc:dd:ee:ff" />
              <p class="help-block">可选。绑定加密脚本到固定网卡</p>
            </div>
            <div class="form-group" style="display: none;">
              <label for="input_bind_ipv4">IPv4 地址</label>
              <input type="text" class="form-control" id="input_bind_ipv4" placeholder="x.x.x.x" />
              <p class="help-block">可选。绑定加密脚本到 IPv4 地址</p>
            </div>
            <button type="button" class="btn btn-primary" id="generate-licenses">开始生成</button>
          </form>
        </div>
        <!-- /.panel-body -->
      </div>
      <!-- /.panel-default -->
    </div>
    <!-- /.tab-pane -->
    <div role="tabpanel" class="tab-pane" id="tab-packer">
      <div class="panel panel-info">
        <div class="panel-heading">打包加密脚本</div>
        <div class="panel-body">
          <form>
            <div class="form-group">
              <p class="help-block">如果 PyInstaller 还没有安装，先运行这个命令进行安装 <code>pip install pyinstaller</code></p>
              <!-- <p class="help-block">PyArmor 能够通过第三方工具，例如 py2exe, cx_Freeze 等，把脚本加密之后直接打包发布</p> -->
              <!-- <p class="help-block">首先要写好 py2exe 或者 cx_Freeze 的安装脚本，并且确保没有加密的脚本已经能够正常打包发布</p> -->
              <!-- <p class="help-block">然后在这里输入主脚本和安装脚本的本机路径名称，点击打包按钮就可以快速把脚本加密然后打包</p> -->
              <!-- <p class="help-block">最终的输出路径和 <code>setup.py</code> 的输出路径是一样的（PyArmor 会更新其中的一些文件）</p> -->
            </div>
            <div class="form-group" style="display: none;">
              <label for="input_packer_type">打包方式</label>
              <select class="form-control" id="input_packer_type">
                <option value="cx_Freeze">cx_Freeze</option>
                <option value="py2app">py2app</option>
                <option value="py2exe">py2exe</option>
                <option value="PyInstaller" selected>PyInstaller</option>
              </select>
              <p class="help-block">打包方式对应的工具必须要先装上，例如 <code>pip install pyinstaller</code></p>
              <p class="help-block">使用 PyInstaller，只需要设置 <strong>主脚本</strong> 就可以打包。使用 cx_Freeze 或者 py2exe，要先写好安装脚本，否则无法打包</p>
              <!-- <p class="help-block">最终的输出路径和打包方式有关</p> -->
            </div>
            <div class="form-group">
              <label for="input_packer_entry">主脚本</label>
              <input type="text" class="form-control required" id="input_packer_entry" />
              <p class="help-block">必填。绝对路径的脚本名称</p>
              <!-- <p class="help-block">主脚本所在目录下的所有 <code>.py</code> 脚本也会被加密</p> -->
            </div>
            <div class="form-group" style="display: none;">
              <label for="input_packer_setup">安装脚本</label>
              <input type="text" class="form-control" id="input_packer_setup"/>
              <p class="help-block">可选。默认值是 <code>setup.py</code></p>
            </div>
            <div class="form-group">
              <label for="input_packer_output">输出路径</label>
              <input type="text" class="form-control" id="input_packer_output"/>
              <p class="help-block">可选。默认是 <strong>主脚本</strong> 同目录下的 <code>dist</code></p>
            </div>
            <button type="button" class="btn btn-primary" id="pack-obfuscated-scripts">开始打包</button>
          </form>
        </div>
        <!-- /.panel-body -->
      </div>
      <!-- /.panel-default -->
    </div>
    <div role="tabpanel" class="tab-pane" id="obfuscator-console">
      <div class="panel panel-info">
        <div class="panel-heading">查看操作日志</div>
        <div class="panel-body">
          <form>
            <div class="form-group">
              <p class="help-block">运行命令 <code>pyarmor-webui</code> 打开 PyArmor 网页版，不支持直接在浏览器打开网页</p>
              <p class="help-block">一个轻量级的 Web 服务器会在后台运行，服务所有的页面请求，所有操作的详细输出会显示在服务器的控制台</p>
              <p class="help-block">网页版只包含最基本的功能，高级用法请使用命令行工具 <code>pyarmor</code></p>
            </div>
            <div class="form-group">
              <label for="project-log-message">日志</label>
              <textarea class="form-control" rows="10" id="project-log-message" readonly></textarea>
            </div>
            <a id="clear-log-message" role="button" class="btn btn-primary">清空日志</a>
          </form>
        </div>
      </div>
      <!-- /.panel-default -->
    </div>
    <!-- /.tab-pane -->
  </div>
  <!-- /.tab-content -->

</body>
</html>
